package com.xbongbong.paas.outerlink.interfaces;

import com.xbongbong.outLink.domain.entity.OuterLinkConfigEntity;
import com.xbongbong.paas.field.FieldAttrEntity;
import com.xbongbong.paas.pojo.OutLinkFieldAttrEntity;
import com.xbongbong.paas.pojo.dto.OuterLinkAddOutLinkExtensionDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkAdvancedGetDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkAdvancedSaveDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkAppearanceGetDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkAppearanceSaveDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkCloseOutLinkDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkConfigGetDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkDelOutLinkExtensionDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkDisplayGetDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkDisplaySaveDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkFilterGetDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkFilterSaveDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkGetOutLinkExtensionDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkPermissionGetDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkPermissionSaveDTO;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.wrap.BaseVO;
import com.xbongbong.pro.outLink.pojo.OutLinkAdvancedGetVO;
import com.xbongbong.pro.outLink.pojo.OutLinkDisplayGetVO;
import com.xbongbong.pro.outLink.pojo.OutLinkExtensionAddVO;
import com.xbongbong.pro.outLink.pojo.OutLinkExtensionGetVO;
import com.xbongbong.pro.outLink.pojo.OutLinkFilterGetVO;
import com.xbongbong.pro.outLink.pojo.OutLinkSettingGetVO;
import com.xbongbong.pro.outLink.pojo.OuterLinkAppearanceGetVO;
import com.xbongbong.pro.outLink.pojo.OuterLinkShareVO;
import com.xbongbong.saas.enums.OutLinkSettingTypeEnum;
import com.xbongbong.saas.enums.OuterLinkTypeEnum;

import java.util.List;

/**
 * 外链设置接口
 * @author long.rao
 * @version v2.0
 * @date 2020/8/10 9:16
 * @since v1.0
 */
public interface PaasOuterLinkConfigService {

    /**
     * 获取外观设置
     * @param outerLinkAppearanceGetDTO 前端入参
     * @return 回参
     * @throws XbbException 系统异常
     */
    OuterLinkAppearanceGetVO getAppearance(OuterLinkAppearanceGetDTO outerLinkAppearanceGetDTO) throws XbbException;

    /**
     * 保存外观设置
     * @param outerLinkAppearanceSaveDTO 前端保存入参
     * @return 回参
     * @throws XbbException 系统异常
     */
    BaseVO saveAppearance(OuterLinkAppearanceSaveDTO outerLinkAppearanceSaveDTO) throws XbbException;

    /**
     * 获取权限设置
     * @param outerLinkPermissionGetDTO 前端入参
     * @return 回参
     * @throws XbbException 系统异常
     */
    BaseVO getPermission(OuterLinkPermissionGetDTO outerLinkPermissionGetDTO) throws XbbException;

    /**
     * 保存权限设置
     * @param outerLinkPermissionSaveDTO 前端入参
     * @return 回参
     * @throws XbbException 系统异常
     */
    BaseVO permissionSave(OuterLinkPermissionSaveDTO outerLinkPermissionSaveDTO) throws XbbException;

    /**
     * 表单外链设置页获取
     * @param outerLinkConfigGetDTO 入参
     * @return 回参
     * @throws XbbException 系统异常
     */
    OutLinkSettingGetVO getOutLinkConfig(OuterLinkConfigGetDTO outerLinkConfigGetDTO) throws XbbException;
    /**
     * 筛选设置保存
     * @param outerLinkFilterSaveDTO 入参
     * @return 回参
     * @throws XbbException 系统异常
     */
    BaseVO filterSave(OuterLinkFilterSaveDTO outerLinkFilterSaveDTO) throws XbbException;

    /**
     * 显示设置保存
     * @param outerLinkDisplaySaveDTO 入参
     * @return 回参
     * @throws XbbException 系统异常
     */
    BaseVO displaySave(OuterLinkDisplaySaveDTO outerLinkDisplaySaveDTO) throws XbbException;

    /**
     * 高级设置保存
     * @param outerLinkAdvancedSaveDTO 入参
     * @return 回参
     * @throws XbbException 系统异常
     */
    BaseVO advancedSave(OuterLinkAdvancedSaveDTO outerLinkAdvancedSaveDTO) throws XbbException;

    /**
     *
     * @param outerLinkDTO 入参
     * @return 回参
     * @throws XbbException 系统异常
     */
    OuterLinkShareVO shareCopy(OuterLinkDTO outerLinkDTO) throws XbbException;

    /**
     * 关闭外链
     * @param outerLinkCloseOutLinkDTO 入参
     * @return 回参
     * @throws XbbException 系统异常
     */
    BaseVO closeOutLink(OuterLinkCloseOutLinkDTO outerLinkCloseOutLinkDTO) throws XbbException;

    /**
     * 添加外联拓展
     * @param outerLinkAddOutLinkExtensionDTO 入参
     * @throws XbbException 系统异常
     */
    OutLinkExtensionAddVO addOutLinkExtension(OuterLinkAddOutLinkExtensionDTO outerLinkAddOutLinkExtensionDTO)  throws XbbException;

    /**
     * 删除外链拓展
     * @param outerLinkDelOutLinkExtensionDTO 入参
     * @return 回参
     * @throws XbbException 系统异常
     */
    BaseVO delOutLinkExtension(OuterLinkDelOutLinkExtensionDTO outerLinkDelOutLinkExtensionDTO) throws XbbException;


    /**
     * 获取外联拓展
     * @param outerLinkGetOutLinkExtensionDTO 入参
     * @return 回参
     * @throws XbbException 系统异常
     */
    OutLinkExtensionGetVO getOutLinkExtension(OuterLinkGetOutLinkExtensionDTO outerLinkGetOutLinkExtensionDTO)  throws XbbException;

    /**
     * 高级设置保存
     * @param outerLinkAdvancedGetDTO 入参
     * @return 回参
     * @throws XbbException 系统异常
     */
    OutLinkAdvancedGetVO getAdvanced(OuterLinkAdvancedGetDTO outerLinkAdvancedGetDTO) throws XbbException;


    /**
     * 显示设置获取
     * @param outerLinkDisplayGetDTO 入参
     * @return 回参
     * @throws XbbException 系统异常
     */
    OutLinkDisplayGetVO displayGet(OuterLinkDisplayGetDTO outerLinkDisplayGetDTO) throws XbbException;

    /**
     * 筛选设置获取
     * @param outerLinkFilterGetDTO 入参
     * @return 回参
     * @throws XbbException 系统异常
     */
    OutLinkFilterGetVO filterGet(OuterLinkFilterGetDTO outerLinkFilterGetDTO) throws XbbException;

    /**
     * 同步外链字段
     * @param filteredSpecialAttr 筛选设置特殊字段
     * @param outLinkFieldAttrEntityList 外链字段
     * @param type 类型
     * @param configType 系统设置类型
     * @return  List<OutLinkFieldAttrEntity>
     */
    List<OutLinkFieldAttrEntity> syncOuterLinkField(List<FieldAttrEntity> filteredSpecialAttr, List<OutLinkFieldAttrEntity> outLinkFieldAttrEntityList, OuterLinkTypeEnum type, OutLinkSettingTypeEnum configType);

    /**
     * 获取外链设置实体
     * @param corpid 公司id
     * @param formId 表单id
     * @param type 类型
     * @param configType 设置类型
     * @return 实体
     * @throws XbbException 系统异常
     */
    OuterLinkConfigEntity getOuterLinkConfigEntities(String corpid, Long formId, Integer type, Integer configType) throws XbbException;


    /**
     * 拿到外链的解释
     * @param corpid 公司id
     * @param formId 表单id
     * @param businessType 业务类型
     * @param type 外链类型
     * @param fromFilter 是否来自筛选
     * @return 字段解释列表
     * @throws XbbException 系统异常
     */
    List<FieldAttrEntity> getOutLinkFieldList(String corpid, Long formId, Integer businessType, Integer type, Integer fromFilter) throws XbbException;

    /**
     * 移除不支持的字段
     * @param businessType 业务类型
     * @param attrList 字段列表
     * @param typeEnum 类型
     */
    default void removeUnsupportedAttr(Integer businessType, List<FieldAttrEntity> attrList, OuterLinkTypeEnum typeEnum) {

    }

}
